
#include <config/configfile.h>
#include "configstack.h"
#include <QPointer>

namespace Opl
{
namespace Core
{

class ConfigFileReadOnly : public Opl::Core::ConfigFile
{
public:
    ConfigFileReadOnly(const QString& filename)
        :ConfigFile(filename){}

    bool save(){ return true; }
    void setValue(const QString&, const QString&, const QVariant&){}
};

class ConfigStackPrivate{

public:

    ConfigStackPrivate()
    {

    }

    ~ConfigStackPrivate()
    {
        foreach(Opl::Core::IConfig* c, configs){
            delete c;
        }
    }


    QList<Opl::Core::IConfig*> configs;

};

ConfigStack::ConfigStack()
    :O_PRIVATE_CREATE(ConfigStack)
{

}

ConfigStack::~ConfigStack()
{
    O_PRIVATE_DELETE;
}

void ConfigStack::addFile(const QString& filename, bool readonly)
{
    O_D(ConfigStack);
    IConfig * c;

    if (readonly){
        c = new ConfigFileReadOnly(filename);
    }else{
        c = new Opl::Core::ConfigFile(filename);
    }

    c->load();
    d->configs.append(c);
}

bool ConfigStack::load()
{
    O_D(ConfigStack);
//	addFile("optra.cfg", true);
    addFile("user.cfg", false);
    return true;
}

bool ConfigStack::save()
{
    O_D(ConfigStack);
    bool b = true;
    foreach(IConfig* c, d->configs){
        b = b && c->save();
    }

    return b;
}

QVariant ConfigStack::value(const QString& section, const QString& key, const QVariant& def/* = QVariant()*/)
{
    O_D(ConfigStack);
    foreach(IConfig* c, d->configs){
        QVariant v = c->value(section, key, def);
        if (v != def){
            return v;
        }
    }

    return def;
}

QVariantList ConfigStack::values(const QString& path)
{
//	O_D(ConfigStack);
//	foreach(IConfig* c, d->configs){
//		QVariantList v = c->values(path);
//		if (!v.isEmpty()){
//			return v;
//		}
//	}

    return QVariantList();
}

QVariant ConfigStack::value(const QString& path, const QVariant& def/* = QVariant()*/)
{
    O_D(ConfigStack);
    foreach(IConfig* c, d->configs){
        QVariant v = c->value(path, def);
        if (v != def){
            return v;
        }
    }

    return def;
}


void ConfigStack::setValue(const QString& section, const QString& key, const QVariant& val)
{
    O_D(ConfigStack);
    foreach(IConfig* c, d->configs){
        c->setValue(section, key, val);
    }
}

}
}

